<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * 결제 컨트롤러
 */
class Payment extends CI_Controller {
	
	var $data = array();
	
	function __construct() {
		parent::__construct();
		$this->data['sess_userinfo'] = $this->session->userdata('userinfo');

		$this->load->model('payment/Payment_model'  , 'payment');
		$this->load->model('product/Cashpoint_model', 'cashpoint');
		$this->load->model('product/Package_model'  , 'package');
		$this->load->model('product/Ticket_model'   , 'ticket');
		$this->load->model('unse/Unse_model'        , 'service');
	}

	// Default
	function index() {
		
	}
	
	/**
	 * 결제창
	 * 페이레터에 넘겨줄 값을 세팅하고 암호화해서 리다이렉트 시켜준다.
	 * 폼값 해킹을 막기위해 폼에서 필수값을 세팅하지 않고 서버에서 값세팅을 한다.
	 */
	function payletter() {
		log_message('debug',"@@@@ Payment::payletter()");

		$p_type     = $this->input->post('p_type');
		$pgcode     = $this->input->post('pgcode');
		
		// 선택한 상품에 대한 정보를 가져온다. (상품명,가격 등)
		$choice_item = array();
		if ($p_type == 'package') {
			$choice_item = $this->package->get_package($this->input->post('package_cd'));
			$choice_item['pname'] = $choice_item['package_name'];
			$choice_item['pcode'] = $choice_item['package_cd'];
		} elseif ($p_type == 'cash') {
			$choice_item = $this->cashpoint->get_cash_to_point($this->input->post('idx'));
			$choice_item['pname'] = $choice_item['cash_name'];
			$choice_item['pcode'] = $choice_item['idx'];
		} elseif ($p_type == 'ticket') {
			$choice_item = $this->service->get_service($this->input->post('service_id'));
			$choice_item['pname'] = $choice_item['service_name'];
			$choice_item['pcode'] = $choice_item['service_id'];
		}
		
		// 주문번호 생성
		$first_no = date("YmdHis",time());
		$last_no = preg_replace("/[^0-9]/", "", $this->session->userdata('session_id') );
		$last_no = substr($last_no, 0, 6);
		$order_no = $first_no.$last_no;	// 주문번호(20) = 날짜+시간(14)+세선ID(6)
		log_message('debug',"@@ 주문번호=$order_no");

		// 페이레터에 넘겨줄 파라미터 값을 받아온다.
		// 페이레터에도 보내고 DB에도 넣어야하기때문에 맵으로 묶어놓는다.
		$send_param['clientid'] = 'unsin';
		$send_param['userid']   = $this->data['sess_userinfo']['user_id'];
		$send_param['ordnm']    = iconv('UTF-8','euc-kr',$this->data['sess_userinfo']['user_name']);
		$send_param['svcnm']    = iconv('UTF-8','euc-kr','운세의신');
		$send_param['amt']      = $choice_item['price_vat'];	// 부가세 포함 가격
		$send_param['ordno']    = $order_no;
		$send_param['pname']    = iconv('UTF-8','euc-kr',$choice_item['pname']);
		$send_param['etcparam'] = $p_type.','.$choice_item['pcode'];
		$send_param['pgcode']   = $pgcode;
		if ($pgcode == '21') {
			$send_param['accountinfo'] = 'B';	//청구개월수( A: selectbox나옴 , B:hidden값으로 999가 들어가 무한정 서비스함을 의미함)
			$send_param['mobile_pgname'] = 'DANAL_MOBILE';
			$send_param['mobile_cpid']   = 'A010013936';
		} elseif ($pgcode == '15') {
			$send_param['pgname'] = 'DACOMCARD';
			$send_param['mallid'] = 'PAYLETTER01';
		}

		// 페이레터 모듈로 암호화 후 전송할 URL을 얻어온다.
		$strPayUrl = $this->_pl_encrypt($send_param);

		redirect($strPayUrl);
	}

	/**
	 * 페이레터 암호화 모듈로 암호화시키고 요청 URL을 리턴한다.
	 * @return 선택한 PG에 맞는 페이레터 URL
	 */
	function _pl_encrypt($send_param) {
		log_message('debug',"@@@@ Payment::_pl_encrypt($send_param)");

		// 페이레터에 보낼 파라미터값 암호화
		$this->load->library('PLParam', array('doc_root'=>ROOT_DIR));

		// 필수 설정 데이터
		$this->plparam->SetParam("clientid", $send_param['clientid']);	//고객사아이디, 페이레터에서 부여한 아이디
		$this->plparam->SetParam("userid"  , $send_param['userid']);	//사용자아이디
		$this->plparam->SetParam("ordnm"   , $send_param['ordnm']);		//사용자명
		$this->plparam->SetParam("svcnm"   , $send_param['svcnm']);		//결제서비스명
		$this->plparam->SetParam("amt"	   , $send_param['amt']);		//결제금액
		$this->plparam->SetParam("ordno"   , $send_param['ordno']);		//주문번호
		$this->plparam->SetParam("pname"   , $send_param['pname']);		//결제상품명
		$this->plparam->SetParam("etcparam", $send_param['etcparam']);	//기타정보,필요한 정보를 설정하면 되돌려줍니다.
		if ($send_param['pgcode'] == '21') {
			$this->plparam->SetParam("accountinfo",$send_param["accountinfo"]);	//청구개월수( A: selectbox나옴 , B:hidden값으로 999가 들어가 무한정 서비스함을 의미함)
			$this->plparam->SetParam("mobile_pgname",$send_param["mobile_pgname"]);
			$this->plparam->SetParam("mobile_cpid",$send_param["mobile_cpid"]);
		}
		if ($send_param['pgcode'] == '15') {
			$this->plparam->SetParam("mallid"  , $send_param["mallid"]);
		}
				
		
		//결과를 받아서 복호화하고 처리할 업체쪽 URL입니다.
		$this->plparam->SetParam("returnurl",ROOT_URL.'/payment/payletter_return/'.$send_param['pgcode']);

		// 휴대폰 결제에는 계약상 콘텐츠와 실물 두가지 계약이 있는데, 실물과 콘텐츠 계약을 모두 한 고객사만 contenttype을 설정해 주시면 됩니다.
		$this->plparam->SetParam("contenttype", "1");	 //휴대폰 결제 계약시 선택한 정보 (1:콘텐츠, 2:실물)
		
		// "돌아가기" 버튼 클릭시 돌아갈 페이지. 만약 오픈창이어서 돌아갈 페이지가 없을꺼라면 적지않으셔도됩니다. 주석처리 요망
		// $this->plparam->SetParam("backurl",$_REQUEST["backurl"]);
		
		// 가상계좌 Noti URL
		$this->plparam->SetParam("notiurl",ROOT_URL.'/payment/noti_va');
		
		$EncryptedData = $this->plparam->Encrypt();
		
		log_message('debug',"@@ EncryptedData=$EncryptedData");
		
		// 모든값이 설정되었고, 설정된 문자열이 암호화가 되었으므로 실제 결제 페이지로 보낸다. 
		// 페이레터에서 알려주는 실제로 결제할 URL, 변경불가!! 
		$strPayUrl = '';
		Switch ($send_param['pgcode']){
			Case(1) : 
				// 신용카드일 경우(allthegate)
				$strPayUrl="http://pg1.payletter.com/PGSVC/Allthegate/ATGPayForm.asp?clientparam=$EncryptedData";
				break;
			Case(2) :
				// 계좌이체일 경우(금결원)
				$strPayUrl = "http://pg1.payletter.com/PGSVC/KFTC/KFTCPayForm.asp?clientparam=$EncryptedData";
				break;
			Case(3) :
				// 휴대폰일 경우(모빌리언스)
				$strPayUrl = "http://pg1.payletter.com/PGSVC/MobilMobile/MobileAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(4) :
				// ARS일 경우(다날)
				$strPayUrl = "http://pg1.payletter.com/PGSVC/DanalARS/DanalARSAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(5) :
				// 문화상품권일 경우(컬처랜드)
				$strPayUrl = "http://pg1.payletter.com/PGSVC/Culture/CultureAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(6) :
				// 도서문화상품권일 경우(도서보급)
				$strPayUrl = "http://pg1.payletter.com/PGSVC/Book/BookAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(7) :
				// 가상계좌
				$strPayUrl = "http://pg1.payletter.com/PGSVC/VAccount/VAccountAssignForm.asp?clientparam=$EncryptedData";
				break;
			Case(8) :
				// 다날 휴대폰일 경우(다날)
				$strPayUrl = "http://pg1.payletter.com/PGSVC/DanalMobile/MobileAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(9) :
				// Cyber1588
				$strPayUrl = "http://pg1.payletter.com/PGSVC/Cyber1588/Cyber1588AuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(10) :
			   // 해피머니상품권
				$strPayUrl = "http://pg1.payletter.com/PGSVC/HappyMoney/HappyAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(11) :
			   // 온캐시
				$strPayUrl = "http://pg1.payletter.com/PGSVC/OnCash/OnCashAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(12) :
			   // 게임문화상품권
				$strPayUrl = "http://pg1.payletter.com/PGSVC/Game/GameAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(13) :
			   // 틴캐시
				$strPayUrl = "http://pg1.payletter.com/PGSVC/TeenCash/TeenCashAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(14) :
			   // BUYFORME
				$strPayUrl = "http://pg1.payletter.com/PGSVC/MobilBF/MobilBFAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(15) :
			   // 신용카드일 경우(LG데이콤)
				$strPayUrl = "http://pg1.payletter.com/PGSVC/DacomCard/ATGPayForm.asp?clientparam=$EncryptedData";
				break;
			Case(16) :
			   //가상계좌일 경우(LG데이콤)
				$strPayUrl = "http://pg1.payletter.com/PGSVC/DacomVaccount/VAccountAssignForm.asp?clientparam=$EncryptedData";
				break;
			Case(17) :
			   // 편의점 결제
				$strPayUrl = "http://pg1.payletter.com/PGSVC/CyberCVS/CVSAuthForm.asp?clientparam=$EncryptedData";
				break;
			Case(18) :
			   // Daou ARS
				$strPayUrl = "http://pg1.payletter.com/PGSVC/DaouARS/DaouARSAuthForm.asp?clientparam=$EncryptedData";
				break;
		    Case(21) :
		       // 스마트폰용 정기청구
		        $strPayUrl = "http://pg1.payletter.com/PGSVC/MobileSmartFixaccount/FixaccountAuthForm.asp?clientparam=$EncryptedData";
		        break;
			Case(22) :
			   // 폰빌
        		$strPayUrl = "http://pg1.payletter.com/PGSVC/WowPhoneBill/WowPhoneBillAuthForm.asp?clientparam=$EncryptedData";
				break;
		}

		return $strPayUrl;
	}

	/*****************************************************************************************
	 * 결제 완료 후 패키지 상품 or 캐쉬 충전
	 *----------------------------------------------------------------------------------------
	 * 페이레터에서 결제 처리후 호출되는 페이지이다.
	 * 가상계좌(pgcode=16)의 경우 noti_va()로 처리된다.
	 *****************************************************************************************/
	function payletter_return($pgcode = '') {
		log_message('debug',"@@@@ Payment::payletter_return($pgcode)");
		
		if ($pgcode == '16') {
			echo "<script type='text/javascript'>";
//			echo "alert('입금이 완료될때 나머지 작업이 진행됩니다.');";
			echo "opener.location.href='/product/va_waiting';";
			echo "window.close();";
			echo "</script>";
			return;
		}

		// 결제 결과 가져오기
		$return_param = $this->_get_result_pl($_REQUEST['clientparam'], $pgcode);
		
		// 결제 결과 LOG
		$this->_write_log_result_pl($return_param, $pgcode);
	
		// 결제 성공시 처리할 것들
		if($return_param['result'] == 'OK') {
			$this->_update_payment_data($return_param);
			// 개별이용권 구매시에는 운세 결과를 보여줘야한다.
			if ($return_param['ptype'] == 'ticket') {
				$return_url = $this->session->userdata('return_url');
				log_message('debug',"return_url=$return_url");

				redirect($return_url);
			}
			// 일반적인 경우엔 결제 완료 페이지를 보여준다.
			else {
				echo "결제가 완료되었습니다.<script type='text/javascript'>opener.location.href='/product/buy_ok/".$return_param['pltid']."';window.close();</script>";
			}
		} else {
			echo "<script type='text/javascript'>opener.location.href='/product/buy_fail/".$return_param['errmsg']."';window.close();</script>";
		}
	}

	/**
	 * 고객이 가상계좌에 입금했을때 페이레터로부터 호출
	 */ 
	function noti_va() {
		log_message('debug',"@@@@ Payment::noti_va()");

		// 결제 결과 가져오기
		$return_param = $this->_get_result_pl($_REQUEST['clientparam'], '16');
		log_message('debug','@@ return_param='.print_r($return_param,TRUE));
		
		// 결제 결과 LOG
		$this->_write_log_result_pl($return_param, '16');
	
		// 결제 성공시 처리할 DB작업
		if($return_param['result'] == '0') {
			$this->_update_payment_data($return_param);
		}
		
		echo "<RESULT>OK</RESULT>";
	}

	/*****************************************************************************************
	 * 결제 성공시 처리할 DB작업
	 *----------------------------------------------------------------------------------------
	 * 
	 * 1. 결제 내역 DB 저장
	 * 2. 패키지 상품 가입일때 상품 등록
	 * 3. 캐쉬 충전 일때 캐쉬 업데이트
	 *   - 캐쉬 업데이트
	 *   - 충전 내역 저장
	 * 4. 결제에 따른 실적등급 업데이트
	 *----------------------------------------------------------------------------------------
	 * @access	private
	 * @param 페이레터에서 처리한 결과Array
	 *****************************************************************************************/
	function _update_payment_data($return_param) {
		log_message('debug',"@@@@ Payment::_update_payment_data($return_param)");
		
		// 결제 내역 DB 저장
		$is_exist = $this->payment->is_exist_payment_history($return_param['ordno']);
		if ($is_exist) {
			die('이미 결제가 처리되었습니다.<br>창을 닫아주세요.');
		}
		$this->payment->insert_payment_history($return_param);

		$this->load->model('point/Point_model', 'point', TRUE);
				
		// 패키지 상품 가입일때는 여기서 처리
		if ($return_param['ptype'] == 'package') {
			
			// 패키지 지급
			$this->package->insert_package_member($return_param['userid'], $return_param['pcode'], date('Ymd',time()));

			// 보너스 포인트 지급
			$package = $this->package->get_package($return_param['pcode']);
			$this->point->update_member_point($return_param['userid'], $package['bonus_point'], NULL);

			// 보너스 포인트 지급 내역 저장
			$this->point->insert_point_charged_history($return_param['userid'], '', $package['bonus_point'], 'B', $package['price'], 0);
		}
		// 캐쉬 충전일때는 여기서 처리
		elseif ($return_param['ptype'] == 'cash') {

			// 결제한 상품에 대한 가격,충전캐쉬 정보를 가져온다.
			$cash_to_point = $this->cashpoint->get_cash_to_point($return_param['pcode']);
			
			// 캐쉬 업데이트
			$this->point->update_member_point($return_param['userid'], $cash_to_point['bonus_point'], $cash_to_point['cash']);
			
			// 캐쉬 충전내역 저장
			$this->point->insert_point_charged_history($return_param['userid'], '', 0, 'C', $cash_to_point['price'], $cash_to_point['cash']);

			// 보너스 포인트 지급 내역 저장
			$this->point->insert_point_charged_history($return_param['userid'], '', $cash_to_point['bonus_point'], 'B', $cash_to_point['price'], 0);
		}
		// 개별 이용권 구매는 여기서 처리
		elseif ($return_param['ptype'] == 'ticket') {

			// 이용권 지급
			$this->ticket->insert_ticket($return_param['userid'], '', $return_param['pcode'], date('Ymd',time()));
		}

		// 실적별 회원등급 업데이트
		// VIP회원권 가입자만 VIP회원이고 나머지는 일반회원으로 한다.
		// $this->payment->member_class_up($return_param['userid']);
	}
	
	/**
	 * 암호화된 결과값을 복호화 해서 배열에 넣어 리턴해준다.
	 * @access	private
	 */
	function _get_result_pl($clientparam, $pgcode) {
		log_message('debug',"@@@@ Payment::_get_result_pl($clientparam)");

		$this->load->library('PLParam', array('doc_root'=>ROOT_DIR));
		$this->plparam->SetParam("resultparam", $clientparam);	// 페이레터의 암호화된 결제결과(clientparam)을 받아서 resultparam에 설정한다.
		
		$return_param['result']   = $this->plparam->GetParam("result");

		$return_param['userid']   = $this->plparam->GetParam("userid");
		$return_param['ordnm']    = iconv('euc-kr','UTF-8',$this->plparam->GetParam("ordnm"));			
		$return_param['ordno']    = $this->plparam->GetParam("ordno");			
		$return_param['svcnm']    = iconv('euc-kr','UTF-8',$this->plparam->GetParam("svcnm"));
		$return_param['pname']    = iconv('euc-kr','UTF-8',$this->plparam->GetParam("pname"));		
		$return_param['etcparam'] = iconv('euc-kr','UTF-8',$this->plparam->GetParam("etcparam"));
		$product                  = explode(",",$return_param['etcparam']);
		$return_param['ptype']    = $product[0];	// [0]=패키지/캐쉬종류
		$return_param['pcode']    = $product[1];	// [1]=상품 코드
		$return_param['pgcode']   = $pgcode;	// 결제수단
			
		if($return_param['result'] == "OK" || ($pgcode == '16' && $return_param['result'] == "0")) {
			// 일반 결제
			$return_param['pltid']     = $this->plparam->GetParam("pltid");
			$return_param['tid']       = $this->plparam->GetParam("tid");
			$return_param['cid']       = $this->plparam->GetParam("cid");
			$return_param['amt']       = $this->plparam->GetParam("amt");
			$return_param['txdate']    = $this->plparam->GetParam("txdate");
			$return_param['txtime']    = $this->plparam->GetParam("txtime");
			$return_param['cardname']  = iconv('euc-kr','UTF-8',$this->plparam->GetParam("cardname"));
			$return_param['abroadchk'] = $this->plparam->GetParam("abroadchk"); // 0:국내, 1:해외

			// 가상계좌
			$return_param['accountno']   = $this->plparam->GetParam("accountno");
	        $return_param['accountname'] = iconv('euc-kr','UTF-8',$this->plparam->GetParam("accountname"));
	        $return_param['expymd']      = $this->plparam->GetParam("expymd");

		} else {
			$return_param['errcode']   = iconv('euc-kr','UTF-8',$this->plparam->GetParam("errcode"));
			$return_param['errmsg']    = iconv('euc-kr','UTF-8',$this->plparam->GetParam("errmsg"));
		}
		
		return $return_param;
	}

	/**
	 * 결제 결과를 파일로그로 남긴다.
	 * @access	private
	 */
	function _write_log_result_pl($return_param, $pgcode = '') {
		log_message('debug',"@@@@ Payment::_write_log_result_pl($return_param, $pgcode)");
		
		$strFileName = "PL".date("Ymd",time());
		$strTotalFileName = LOG_PATH.$strFileName.".log";
		
		$objFSO = fopen($strTotalFileName,"a+"); //파일이 없으면 새로 생성되고, 있으면 해당 파일에 업데이트함.
		
		if(!$objFSO) {
			echo("해당 파일이 없습니다.");
		} else {
			fwrite($objFSO,"====================================================================================="."\r\n");
			fwrite($objFSO,"Logging Time :".date("Y-m-d h:i")."\r\n");
			fwrite($objFSO,"사용자ID : ".$return_param['userid']."\r\n");		
			fwrite($objFSO,"사용자명 : ".$return_param['ordnm']."\r\n");			
			fwrite($objFSO,"주문번호 : ".$return_param['ordno']."\r\n");			
			fwrite($objFSO,"결제서비스명 : ".$return_param['svcnm']."\r\n");
			fwrite($objFSO,"결제상품명 : ".$return_param['pname']."\r\n");
			fwrite($objFSO,"상품타입 : ".$return_param['ptype']."\r\n");
			fwrite($objFSO,"상품코드 : ".$return_param['pcode']."\r\n");
			fwrite($objFSO,"결제수단 : ".$pgcode."\r\n");
			fwrite($objFSO,"고객사 기타 설정 값 : ".$return_param['etcparam']."\r\n");
		
			if($return_param['result'] == "OK" || ($pgcode == '16' && $return_param['result'] == "0")) {
				
				// 일반적인 경우
				if ($pgcode != '16') {
					fwrite($objFSO,"결제고유번호 : ".$return_param['pltid']."\r\n");
					fwrite($objFSO,"결제수단승인번호 : ".$return_param['tid']."\r\n");
					fwrite($objFSO,"카드승인번호 : ".$return_param['cid']."\r\n");
					fwrite($objFSO,"결제금액 : ".$return_param['amt']."\r\n");
					fwrite($objFSO,"결제일자 : ".$return_param['txdate']."\r\n");
					fwrite($objFSO,"결제시간 : ".$return_param['txtime']."\r\n");	
					fwrite($objFSO,"결제수단정보 : ".$return_param['cardname']."\r\n");
					fwrite($objFSO,"해외카드구분 : ".$return_param['abroadchk']."\r\n"); // 0:국내, 1:해외
				}
				// 가상계좌일경우
				else {
			        fwrite($objFSO,"가상계좌번호 : ".$return_param['accountno']."\r\n");
			        fwrite($objFSO,"계좌주명 : ".$return_param['accountname']."\r\n");
			        fwrite($objFSO,"송금액 : ".$return_param['amt']."\r\n");
			        fwrite($objFSO,"유효기간 : ".$return_param['expymd']."\r\n");
				}
			} else {
				fwrite($objFSO,"에러코드 = ".$return_param['errcode']."\r\n");
				fwrite($objFSO,"에러메세지 = ".$return_param['errmsg']."\r\n");		
			}
			fwrite($objFSO,"====================================================================================="."\r\n");
			fclose($objFSO);
		}
	}
}

/* End of file premium.php */
/* Location: ./application/controllers/premium.php */